package com.campus.secondhand.service;

import java.util.List;

import com.campus.secondhand.common.Result;
import com.campus.secondhand.model.dto.MessageSendDTO;
import com.campus.secondhand.model.dto.ProductMessageDTO;
import com.campus.secondhand.model.dto.PurchaseRequestMessageDTO;
import com.campus.secondhand.model.vo.ConversationVO;
import com.campus.secondhand.model.vo.MessageVO;

/**
 * 消息服务接口
 */
public interface MessageService {

    /**
     * 发送消息
     * 
     * @param senderId       发送者ID
     * @param messageSendDTO 消息发送DTO
     * @return 发送结果
     */
    Result<MessageVO> sendMessage(Long senderId, MessageSendDTO messageSendDTO);

    /**
     * 获取用户的所有会话列表（分页）
     * 
     * @param userId   用户ID
     * @param page     页码
     * @param pageSize 每页数量
     * @return 会话列表
     */
    Result<List<ConversationVO>> getUserConversationsPaged(Long userId, Integer page, Integer pageSize);

    /**
     * 获取与指定用户的会话消息列表
     * 
     * @param userId       当前用户ID
     * @param targetUserId 目标用户ID
     * @return 消息列表
     */
    Result<List<MessageVO>> getConversationMessages(Long userId, Long targetUserId);

    /**
     * 获取与指定用户关于特定商品的会话消息列表
     * 
     * @param userId       当前用户ID
     * @param targetUserId 目标用户ID
     * @param productId    商品ID
     * @return 消息列表
     */
    Result<List<MessageVO>> getConversationMessagesForProduct(Long userId, Long targetUserId, Long productId);

    /**
     * 获取指定会话的消息列表（分页）
     *
     * @param userId         用户ID
     * @param conversationId 会话ID
     * @param page           页码
     * @param pageSize       每页数量
     * @return 消息列表
     */
    Result<List<MessageVO>> getChatMessages(Long userId, Long conversationId, Integer page, Integer pageSize);

    /**
     * 标记与指定用户的会话为已读
     * 
     * @param userId       当前用户ID
     * @param targetUserId 目标用户ID
     * @return 操作结果
     */
    Result<Void> markConversationAsRead(Long userId, Long targetUserId);

    /**
     * 根据会话ID标记消息为已读
     * 
     * @param userId         当前用户ID
     * @param conversationId 会话ID
     * @return 操作结果
     */
    Result<Void> markConversationMessagesAsRead(Long userId, Long conversationId);

    /**
     * 删除与指定用户的会话
     * 
     * @param userId       当前用户ID
     * @param targetUserId 目标用户ID
     * @return 操作结果
     */
    Result<Void> deleteConversation(Long userId, Long targetUserId);

    /**
     * 创建新会话
     * 
     * @param userId    发起方用户ID
     * @param partnerId 对话方用户ID
     * @return 创建的会话
     */
    Result<ConversationVO> createConversation(Long userId, Long partnerId);

    /**
     * 根据会话ID删除会话
     * 
     * @param userId         用户ID
     * @param conversationId 会话ID
     * @return 操作结果
     */
    Result<Void> deleteConversationById(Long userId, Long conversationId);
}